//
//  AudioConfig.swift
//  CMB250716
//
//  Created by Assistant on 2024-07-28.
//

import Foundation
import AVFoundation

// MARK: - 音频配置管理
struct AudioConfig {
    
    // MARK: - 视频播放配置
    struct VideoPlayback {
        /// 当其他音频播放时是否暂停视频（设为false确保视频持续播放）
        static let pauseWhenOtherAudioPlaying = false
        
        /// 当应用进入后台时是否暂停视频
        static let pauseWhenAppInBackground = true
        
        /// 音频中断恢复延迟（秒）
        static let interruptionRecoveryDelay: TimeInterval = 0.5
        
        /// 播放失败时是否显示错误
        static let showErrorOnPlaybackFailure = true
    }
    
    // MARK: - 兼容性配置
    struct Compatibility {
        /// 是否启用音频中断监听
        static let enableAudioInterruptionMonitoring = true
        
        /// 是否启用音频路由变化监听
        static let enableAudioRouteChangeMonitoring = true
    }
    

    
    // MARK: - 静态方法
    
    /// 是否启用智能音频焦点管理
    static func shouldEnableSmartAudioFocus() -> Bool {
        return true
    }
    
    /// 视频是否默认静音
    static func shouldVideoDefaultMuted() -> Bool {
        return false
    }
    
    /// 获取当前音频会话配置
    static func getCurrentAudioSessionConfig() -> (AVAudioSession.Category, AVAudioSession.CategoryOptions) {
        // 使用 .mixWithOthers 确保与其他音频应用共存，不使用 .duckOthers 避免干扰
        return (.playback, [.mixWithOthers])
    }
}

// MARK: - 音频配置扩展
extension AudioConfig {
    
    /// 音频会话配置预设
    enum AudioSessionPreset {
        case videoPlayback
        case backgroundAudio
        case mixedAudio
        
        var configuration: (AVAudioSession.Category, AVAudioSession.CategoryOptions) {
            switch self {
            case .videoPlayback:
                // 视频播放：与其他音频混合，不干扰其他应用
                return (.playback, [.mixWithOthers])
            case .backgroundAudio:
                // 后台音频：与其他音频混合
                return (.playback, [.mixWithOthers])
            case .mixedAudio:
                // 混合音频：支持录音和播放，与其他音频混合
                return (.playAndRecord, [.mixWithOthers, .allowBluetooth])
            }
        }
    }
    
    /// 获取指定预设的音频会话配置
    static func getAudioSessionConfig(for preset: AudioSessionPreset) -> (AVAudioSession.Category, AVAudioSession.CategoryOptions) {
        return preset.configuration
    }
}